package cn.iocoder.yudao.module.erp.service.deppurchaseitem;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.deppurchaseitem.vo.DepPurchaseItemPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.deppurchaseitem.vo.DepPurchaseItemRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.deppurchaseitem.vo.DepPurchaseItemSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.deppurchase.DepPurchaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.deppurchaseitem.DepPurchaseItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO;
import cn.iocoder.yudao.module.erp.dal.mysql.deppurchase.DepPurchaseMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.deppurchaseitem.DepPurchaseItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpSupplierMapper;
import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.DEP_PURCHASE_ITEM_NOT_EXISTS;

/**
 * ERP 科室采购申请项 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class DepPurchaseItemServiceImpl implements DepPurchaseItemService {


    @Resource
    private DepPurchaseMapper depPurchaseMapper;
    @Resource
    private DepPurchaseItemMapper depPurchaseItemMapper;
    @Resource
    private ErpSupplierMapper supplierMapper;
    @Resource
    private NotifySendService notifySendService;


    @Override
    public Long createDepPurchaseItem(DepPurchaseItemSaveReqVO createReqVO) {
        // 插入
        DepPurchaseItemDO depPurchaseItem = BeanUtils.toBean(createReqVO, DepPurchaseItemDO.class);
        depPurchaseItemMapper.insert(depPurchaseItem);
        // 返回
        return depPurchaseItem.getId();
    }

    @Override
    public void updateDepPurchaseItem(DepPurchaseItemSaveReqVO updateReqVO) {

        // 更新
        DepPurchaseItemDO updateObj = BeanUtils.toBean(updateReqVO, DepPurchaseItemDO.class);
        depPurchaseItemMapper.updateById(updateObj);
    }

    @Override
    public void updatecount(DepPurchaseItemSaveReqVO updateReqVO) {

        depPurchaseItemMapper.updatecount(updateReqVO);
    }
    public void updatecounts(DepPurchaseItemSaveReqVO updateReqVO) {

        depPurchaseItemMapper.updatecounts(updateReqVO);
    }




    @Override
    public void deleteDepPurchaseItem(Long id) {
        // 校验存在
        validateDepPurchaseItemExists(id);
        // 删除
        depPurchaseItemMapper.deleteById(id);
    }

    private void validateDepPurchaseItemExists(Long id) {
        if (depPurchaseItemMapper.selectById(id) == null) {
            throw exception(DEP_PURCHASE_ITEM_NOT_EXISTS);
        }
    }

    @Override
    public DepPurchaseItemDO getDepPurchaseItem(Long id) {
        return depPurchaseItemMapper.selectById(id);
    }

    @Override
    public PageResult<DepPurchaseItemDO> getDepPurchaseItemPage(DepPurchaseItemPageReqVO pageReqVO) {
        return depPurchaseItemMapper.selectPage(pageReqVO);
    }

    @Override
    public  List<DepPurchaseItemDO> getDepPurchaseItemByPriWarehouseIntegraId(DepPurchaseItemPageReqVO pageReqVO) {
        // 根据整合单编号查采购单
        List<DepPurchaseItemDO> depPurchaseItemDOS = depPurchaseItemMapper.getByPriWarehouseIntegraId(pageReqVO.getIntegrateId());

        return  depPurchaseItemDOS;
    }

    @Override
    public void updateDepPurchaseItemByList(DepPurchaseItemSaveReqVO updateReqVO) {
        List<DepPurchaseItemRespVO> list = updateReqVO.getList();
        List<Long> ids = list.stream().map(DepPurchaseItemRespVO::getId).collect(Collectors.toList());
        List<DepPurchaseItemDO> depPurchaseItemDOS = depPurchaseItemMapper.selectByIds(ids);
        for (DepPurchaseItemDO depPurchaseItemDO : depPurchaseItemDOS) {
            for (DepPurchaseItemRespVO depPurchaseItemRespVO : list) {
                if (depPurchaseItemDO.getId().equals(depPurchaseItemRespVO.getId())) {
                    depPurchaseItemDO.setCountActual(depPurchaseItemRespVO.getCountActual());
                }
            }
        }
        depPurchaseItemMapper.updateBatch(depPurchaseItemDOS);
    }

    @Override
    public void updateDepPurchaseItemSupplier(DepPurchaseItemSaveReqVO updateReqVO) {
        // 根据供应商id查找供应商部门id
        ErpSupplierDO erpSupplierDO = supplierMapper.selectById(updateReqVO.getSupplierId());
        if (erpSupplierDO != null) {
            updateReqVO.setSupplierDeptId(erpSupplierDO.getDeptId());
            depPurchaseItemMapper.updateDepPurchaseItemSupplier(updateReqVO);
        }

    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void sendBackDepPurchaseItem(DepPurchaseItemPageReqVO pageReqVO) {
        // 整合单号
        String integrateId = pageReqVO.getIntegrateId();
        Long productId = pageReqVO.getProductId();
        List<Long> userIds = new ArrayList<>();

        List<DepPurchaseDO> depPurchaseDO = depPurchaseMapper.getDepPurchaseDOByIntegraId(integrateId);
        if(depPurchaseDO.size() > 0){
            List<Long> ids = depPurchaseDO.stream().map(DepPurchaseDO::getId).collect(Collectors.toList());
            List<DepPurchaseItemDO> depPurchaseItems = depPurchaseItemMapper.getDepPurchaseItemByOrderId(ids);
            for (DepPurchaseItemDO depPurchaseItem : depPurchaseItems) {
                if (depPurchaseItem.getProductId().equals(productId)) {
                    depPurchaseItem.setReturnReason(pageReqVO.getReturnReason());
                    depPurchaseItem.setStatus(Long.parseLong("1"));
                    userIds.add(Long.parseLong(depPurchaseItem.getCreator()));
                }

            }
            depPurchaseItemMapper.updateBatch(depPurchaseItems);

        }

        Map<String, Object> templateParams = new HashMap<>();
        templateParams.put("name", pageReqVO.getProductName());
        templateParams.put("reason", pageReqVO.getReturnReason());
        notifySendService.sendSingleNotifyToAdminList(userIds,
                "sendBackInform", templateParams);
    }

}